package com.cpimex.eprice;

import java.sql.*;
import java.util.*;
import com.cpimex.eprice.bean.SegmentoPrecioL;
import com.cpimex.eprice.bean.GrupoBean;
import com.cpimex.eprice.bean.SegmentoBean;
import com.cpimex.eprice.bean.PrecioListaBean;
import java.text.NumberFormat;

public class PrecioLista {
    private static NumberFormat nf = NumberFormat.getInstance();
    static{
        nf.setMaximumFractionDigits(4);
        nf.setMinimumFractionDigits(4);
    }


    public PrecioLista() {
    }
    
    
    /**
     * 
     * @param stmt
     * @return
     * @throws SQLException
     */
    public ArrayList listarSegmento(Statement stmt) throws SQLException {
        ArrayList arrL_segmento = new ArrayList();
        String str_query = " SELECT codigo_seg,          " +
                           "        descripcion_seg,     " +
                           "        codigo_div           " +
                           " FROM ep_vw_segmento         " +
                           "     ORDER BY codigo_seg     ";
        ResultSet rs = stmt.executeQuery(str_query);

        while (rs.next()) {
            String str_codigoSeg = rs.getString("codigo_seg");
            String str_descSeg = rs.getString("descripcion_seg");
            String str_codigoDiv = rs.getString("codigo_div");

            SegmentoBean bn_segmento = new SegmentoBean();
            bn_segmento.setStr_codigoSeg(str_codigoSeg);
            bn_segmento.setStr_descSeg(str_descSeg.length() > 20 ?
                                       str_descSeg.substring(0, 17) + "..." :
                                       str_descSeg);
            
            if(str_codigoDiv.equals("1"))
            	str_codigoDiv  = "CC9900";
            if(str_codigoDiv.equals("2"))
            	str_codigoDiv  = "CCCC00";
            if(str_codigoDiv.equals("4"))
            	str_codigoDiv  = "CC9966";
            	
            	
            bn_segmento.setStr_codigoDiv(str_codigoDiv);

            arrL_segmento.add(bn_segmento);
        }
        return arrL_segmento;
    }

    
    /**
     * 
     * @param stmt
     * @param str_idGrupo
     * @param str_rangoMin
     * @param str_rangoMax
     * @return
     * @throws SQLException
     */
    public ArrayList editarSegmentoPrecio(
    		Statement stmt, 
    		String str_idGrupo,
            String str_rangoMin,
            String str_rangoMax) throws SQLException {
    	
        ArrayList arrL_segemento = new ArrayList();
        String str_query;
        if (str_rangoMin != null && str_rangoMax != null) {
            double dbl_rango_Min = Double.parseDouble(str_rangoMin);
            double dbl_rango_Max = Double.parseDouble(str_rangoMax);

            str_query =
                    " SELECT pl.id_precioL,                                   " +
                    "        pl.id_grupo,                                     " +
                    "        pl.codigoSeg_precioL,                            " +
                    "        vs.descripcion_seg,                              " +
                    "        pl.rangomin_precioL,                             " +
                    "        pl.rangomax_precioL,                             " +
                    "        pl.cantidad_precioL                              " +
                    " FROM ep_precioLista pl                                  " +
                    "     INNER JOIN ep_vw_segmento vs                        " +
                    "            ON  vs.codigo_seg = pl.codigoSeg_precioL     " +
                    " WHERE id_grupo = '" + str_idGrupo + "' AND              " +
                    "       rangomin_precioL = '" + dbl_rango_Min + "' AND    " +
                    "       rangomax_precioL = '" + dbl_rango_Max + "'        " +
                    " ORDER BY pl.id_precioL, pl.codigoSeg_precioL            " ;
        }else
            str_query = " SELECT codigo_seg AS codigoSeg_precioL,             " +
                        "        descripcion_seg ,                            " +
                        "        0.00000 AS cantidad_precioL                  " +
                        " FROM ep_vw_segmento                                 " +
                        " ORDER BY codigo_seg                                 ";

        //System.out.println(str_query);

        ResultSet rs = stmt.executeQuery(str_query);
        boolean bool_fila = false;
        while (rs.next()) {
            String str_codigoSeg = rs.getString("codigoSeg_precioL");
            String str_descSeg = rs.getString("descripcion_seg");
            String str_cantidadPrecio = rs.getString("cantidad_precioL");

            SegmentoPrecioL bn_segmento = new SegmentoPrecioL();
            bn_segmento.setStr_codigoSeg(str_codigoSeg);
            bn_segmento.setStr_descSeg(str_descSeg);
            bn_segmento.setStr_cantidadPrecio(str_cantidadPrecio);
            bn_segmento.setBool_fila(bool_fila);

            bool_fila = !bool_fila;

            arrL_segemento.add(bn_segmento);
        }
        return arrL_segemento;
    }

    
    /**
     * 
     * @param stmt
     * @param str_idGrupo
     * @param str_rangoMin
     * @param str_rangoMax
     * @param str_codigoSeg
     * @param str_cantidadPrecio
     * @param str_rangoMinAnt
     * @param str_rangoMaxAnt
     * @throws SQLException
     */
    public void actualizarPrecioL(
    		Statement stmt, 
    		String str_idGrupo,
    		String str_rangoMin, 
    		String str_rangoMax, 
    		String[] str_codigoSeg,
    		String[] str_cantidadPrecio, 
    		String str_rangoMinAnt, 
    		String str_rangoMaxAnt) throws SQLException {
    	
        String str_query;
        float flt_rango_Min = Float.parseFloat(str_rangoMin);
        float flt_rango_Max = Float.parseFloat(str_rangoMax);
        float flt_cantidadPrecio;

        for (int int_i = 0; int_i < str_codigoSeg.length; int_i++) {
            flt_cantidadPrecio = Float.parseFloat(str_cantidadPrecio[int_i]);

            str_query =
                    " UPDATE ep_precioLista SET                                    " +
                    "        rangomin_precioL = " + flt_rango_Min + " ,            " +
                    "        rangomax_precioL = " + flt_rango_Max + "  ,           " +
                    "        cantidad_precioL = " + flt_cantidadPrecio + "         " +
                    " WHERE id_grupo = '" + str_idGrupo + "' AND                   " +
                    "       codigoSeg_precioL = '" + str_codigoSeg[int_i] + "' AND " +
                    "       rangomin_precioL = " + str_rangoMinAnt + " AND           " +
                    "       rangomax_precioL = " + str_rangoMaxAnt + "               ";
                    //System.out.println(str_query);
            stmt.executeUpdate(str_query);
        }
    }

    
    /**
     * 
     * @param stmt
     * @param str_idGrupo
     * @param str_rangoMin
     * @param str_rangoMax
     * @param str_codigoSeg
     * @param str_cantidadPrecio
     * @throws SQLException
     */
    public void insertarPrecioL(
    		Statement stmt,
    		String str_idGrupo,
    		String str_rangoMin,
    		String str_rangoMax,
    		String[] str_codigoSeg,
    		String[] str_cantidadPrecio) throws SQLException {
        
    	String str_query;
        double dbl_rango_Min = Double.parseDouble(str_rangoMin);
        double dbl_rango_Max = Double.parseDouble(str_rangoMax);
        double dbl_cantidadPrecio;

        for (int int_i = 0; int_i < str_codigoSeg.length; int_i++) {
            dbl_cantidadPrecio = Double.parseDouble(str_cantidadPrecio[int_i]);

            str_query = " INSERT INTO ep_precioLista(rangomin_precioL,       " +
                        "                            rangomax_precioL,       " +
                        "                            codigoSeg_precioL,      " +
                        "                            cantidad_precioL,       " +
                        "                            id_grupo)               " +
                        " VALUES (" + dbl_rango_Min +
                        ",                         " +
                        dbl_rango_Max + ",                         '" +
                        str_codigoSeg[int_i] + "',                  " +
                        dbl_cantidadPrecio + " ,                   '" +
                        str_idGrupo + "')                           ";

            stmt.executeUpdate(str_query);
        }
    }

    
    /**
     * 
     * @param stmt
     * @param str_grupo
     * @return
     * @throws SQLException
     */
    public ArrayList listarGrupo(
    		Statement stmt, 
    		String str_grupo) throws SQLException {
        ArrayList arr_grupo = new ArrayList();
        ResultSet rs = null;
        String str_query = "SELECT id_grupo, " +
                           " desc_grupo, " +
                           " linea_grupo " +
                           " FROM ep_grupo " +
                           " WHERE id_grupo = '" + str_grupo + "'";

        rs = stmt.executeQuery(str_query);

        while (rs.next()) {
            String str_idGrupo = rs.getString("id_grupo");
            String str_descGrupo = rs.getString("desc_grupo");
            String str_lineaGrupo = rs.getString("linea_grupo");
            if (str_lineaGrupo == null)
                str_lineaGrupo = "";
            GrupoBean bn_grupo = new GrupoBean();

            bn_grupo.setStr_idGrupo(str_idGrupo);
            bn_grupo.setStr_descGrupo(str_descGrupo);
            bn_grupo.setStr_lineaGrupo(str_lineaGrupo);

            arr_grupo.add(bn_grupo);
        }
        return arr_grupo;
    }


    
    /**
     * 
     * @param stmt
     * @return
     * @throws SQLException
     */
    public ArrayList listarGrupo(Statement stmt) throws SQLException {
        ArrayList arrL_grupos;
        Grupo grupo = new Grupo();
        arrL_grupos = grupo.listarGrupo(stmt, null);

        return arrL_grupos;
    }
    
    
    /**
     * 
     * @param stmt
     * @param str_idGrupo
     * @param str_rangoMin
     * @param str_rangoMax
     * @return
     * @throws SQLException
     */
    public boolean validaRango(
    		Statement stmt, 
    		String str_idGrupo,
    		String str_rangoMin, 
    		String str_rangoMax) throws SQLException {
    	
        boolean bool_valida = true;
        float flt_rango_Min = Float.parseFloat(str_rangoMin);
        float flt_rango_Max = Float.parseFloat(str_rangoMax);
        float[] flt_rango = {flt_rango_Min, flt_rango_Max};

        String str_queryMax = " SELECT  DISTINCT id_grupo, " +
                              "                  rangomin_precioL, " +
                              "                  rangomax_precioL  " +
                              " FROM ep_precioLista " +
                              " WHERE id_Grupo = '"+ str_idGrupo +"' AND" +
                              "      "+flt_rango_Min+" > (SELECT MAX(pl.rangomin_precioL) FROM ep_precioLista pl) and" +
                              "       rangomin_precioL = (SELECT MAX(pl.rangomin_precioL) FROM ep_precioLista pl) AND" +
                              "       rangomax_precioL = '-1'";
        ResultSet rsM = stmt.executeQuery(str_queryMax);

        while(rsM.next()){
            bool_valida = false;
        }

        for (int int_i = 0; int_i < flt_rango.length; int_i++) {
            String str_query = " SELECT DISTINCT pl.id_grupo,                         " +
                               "                 pl.rangomin_precioL,                 " +
                               "                 pl.rangomax_precioL                  " +
                               " FROM ep_precioLista pl                               " +
                               " WHERE id_grupo = '"+str_idGrupo+"' AND               " +
                               " ("+flt_rango[int_i]+" BETWEEN rangomin_precioL AND " +
                               "                                 rangomax_precioL)    ";

            ResultSet rs = stmt.executeQuery(str_query);
            while(rs.next()){
                bool_valida = false;
            }
        }
        return bool_valida;
    }

    
    /**
     * 
     * @param stmt
     * @param str_idGrupo
     * @param str_rangoMin
     * @param str_rangoMax
     * @param str_rangoMinAnt
     * @param str_rangoMaxAnt
     * @return
     * @throws SQLException
     */
    public boolean validaRango(
    		Statement stmt, 
    		String str_idGrupo, 
    		String str_rangoMin, 
    		String str_rangoMax, 
    		String str_rangoMinAnt, 
    		String str_rangoMaxAnt) throws SQLException {
    	
        boolean bool_valida = true;
        float flt_rango_Min = Float.parseFloat(str_rangoMin);
        float flt_rango_Max = Float.parseFloat(str_rangoMax);
        float[] flt_rango = {flt_rango_Min, flt_rango_Max};

        String str_queryMax = " SELECT  DISTINCT id_grupo, " +
                              "                  rangomin_precioL, " +
                              "                  rangomax_precioL  " +
                              " FROM ep_precioLista " +
                              " WHERE id_Grupo = '"+ str_idGrupo +"' AND" +
                              "      "+flt_rango_Min+" > (SELECT MAX(pl.rangomin_precioL) FROM ep_precioLista pl where id_Grupo = '"+ str_idGrupo +"') and" +
                              "       rangomin_precioL = (SELECT MAX(pl.rangomin_precioL) FROM ep_precioLista pl where id_Grupo = '"+ str_idGrupo +"') AND" +
                              "       rangomax_precioL = '-1' and ( rangomin_precioL <> "+str_rangoMinAnt+" and rangomax_precioL <> "+str_rangoMaxAnt+" ) ";
        ResultSet rsM = stmt.executeQuery(str_queryMax);
        while(rsM.next()){
            bool_valida = false;
        }

        for (int int_i = 0; int_i < flt_rango.length; int_i++) {
            String str_query = " SELECT DISTINCT pl.id_grupo,                         " +
                               "                 pl.rangomin_precioL,                 " +
                               "                 pl.rangomax_precioL                  " +
                               " FROM ep_precioLista pl                               " +
                               " WHERE id_grupo = '"+str_idGrupo+"' AND               " +
                               " ("+flt_rango[int_i]+" BETWEEN rangomin_precioL AND " +
                               "                                 rangomax_precioL) AND ( rangomin_precioL <> "+str_rangoMinAnt+" and rangomax_precioL <> "+str_rangoMaxAnt+" )    ";

            ResultSet rs = stmt.executeQuery(str_query);
            while(rs.next()){
                bool_valida = false;
            }
        }
        return bool_valida;
    }

    
    /**
     * 
     * @param stmt_precios
     * @param int_idGrupo
     * @return
     * @throws SQLException
     */
    public ArrayList listarPrecios( 
    		Statement stmt_precios, 
    		int int_idGrupo )throws SQLException{
    	
        ArrayList arrL_retVal = new ArrayList();
        ArrayList arrL_segmentos = listarSegmento(stmt_precios.getConnection().createStatement());
        String str_precios =
            " exec sp_preciosLista "+int_idGrupo;
        ResultSet rs_precios = stmt_precios.executeQuery(str_precios);
        double dbl_rangoMin = 0;
        double dbl_rangoMax = 0;
        ArrayList arrL_precios;
        while( rs_precios.next() ){
            dbl_rangoMin = rs_precios.getDouble("rango_minimo");
            dbl_rangoMax = rs_precios.getDouble("rango_maximo");
            arrL_precios = new ArrayList();
            Iterator itr_tmp = arrL_segmentos.iterator();
            while( itr_tmp.hasNext( ) ){
                arrL_precios.add(nf.format(rs_precios.getDouble("seg_"+((SegmentoBean)itr_tmp.next( )).getStr_codigoSeg())));
            }
            PrecioListaBean precio = new PrecioListaBean(dbl_rangoMin,dbl_rangoMax,arrL_precios);
            arrL_retVal.add(precio);
        }
        rs_precios.close();
        return arrL_retVal;
    }
}
